<?php

declare(strict_types=1);

namespace app\admin\validate;

use think\Validate;

class Serialnumber extends Validate
{
    /**
     * 定义验证规则
     * 格式：'字段名' =>  ['规则1','规则2'...]
     *
     * @var array
     */
    protected $rule = [
        'sn_id'       => 'max:18',
        'pid'         => 'require|integer|>:0',
        'seller_id'   => 'require|integer|>:0',
        'wid'         => 'integer|>:0',
        'status'      => 'checkEmpty|integer|in:-1,0,1,2,3,4',
        'number'      => 'integer|>:0',
        'start_time'  => 'date',
        'end_time'    => 'date',
        'action'      => 'require|integer|in:2,3,4',
        'format'      => 'in:png,base64',

    ];

    /**
     * 定义错误信息
     * 格式：'字段名.规则名' =>  '错误信息'
     *
     * @var array
     */
    protected $message = [
        'sn_id.max'              => 'SN码长度不能超过18位',
        'sn_id.require'          => 'SN码不能为空',
        'pid.require'            => '商品ID不能为空',
        'pid.integer'            => '商品ID必须是整数',
        'pid.>'                  => '商品ID必须大于0',
        'seller_id.require'      => '供应商ID不能为空',
        'seller_id.integer'      => '供应商ID必须是整数',
        'seller_id.>'            => '供应商ID必须大于0',
        'wid.integer'            => '仓库ID必须是整数',
        'wid.>'                  => '仓库ID必须大于0',
        'status.integer'         => '状态必须是整数',
        'status.in'              => '状态值无效，允许的值：-1(废弃),0(未使用),1(已使用),2(已入库),3(已出库),4(维修中)',
        'number.integer'         => '数量必须是整数',
        'number.>'               => '数量必须大于0',
        'start_time.date'        => '开始时间格式错误',
        'end_time.date'          => '结束时间格式错误',
        'action.require'         => '操作类型不能为空',
        'action.integer'         => '操作类型必须是整数',
        'action.in'              => '操作类型值无效，允许的值：2(入库),3(出库),4(维修)',
    ];

    protected $scene = [
        'save' => ['pid', 'number', 'seller_id'],
        'search' => ['sn_id', 'status', 'start_time', 'end_time'],
        'discard' => ['sn_id'],
        'scanCode' => ['sn_id'],
        'generateSnPictures' => ['sn_id'],
    ];

    /**
     * discard场景回调方法
     */
    protected function sceneDiscard()
    {
        return $this->only(['sn_id'])
            ->append('sn_id', 'require');
    }

    /**
     * 自定义验证规则：检查空值
     * 不传参数允许，传了空字符串不允许
     */
    protected function checkEmpty($value, $rule, $data, $field)
    {
        // 如果参数不存在，允许通过
        if (!isset($data[$field])) {
            return true;
        }

        // 如果参数存在但为空字符串，验证失败
        if ($data[$field] === '') {
            return $field . '不能为空字符串';
        }

        return true;
    }
}
